AWS入門ブログリレー2024〜AWS CloudTrail編〜
当エントリは弊社AWS事業本部による『AWS 入門ブログリレー 2024』の40日目のエントリです。
このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2024 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。
では、さっそくいってみましょう。今回のテーマは『AWS CloudTrail』です。
AWS CloudTrail とは?
AWS CloudTrail(以降、CloudTrailと略します)は、AWSアカウント/ユーザー/ロール/AWSサービスが実行したアクションをイベントとして記録するサービスです。
ここでいうアクションとは、AWS APIへのリクエスト(通信)のことを指します。
みなさんがAWSを利用する際にはAPIの存在を意識したことはあまりないと思いますが、それは以下のようなAPI利用を簡単にするツールがAWSから提供されているからです。
- AWSマネジメントコンソール:WebブラウザからAWS APIを操作できる
- AWS CLI:コマンドライン上からAWS APIを操作できる
- AWS SDK:JavaやPythonなどプログラミング言語でAWS APIを実装できる
これらのツール(APIインターフェイス)を駆使して、以下の図のようにAPIリクエストを送信しているイメージです。
始め方
CloudTrailの記録はアカウント作成時にデフォルトで有効化されています。
記録されたイベントはCloudTrail > イベント履歴
からチェックできます。
イベント履歴はGUI操作で直近90日以内の管理イベントが閲覧できます。
イベントの属性(ルックアップ属性)、タイムスタンプによるフィルタが可能で、フィルタを両方かけることもできます。
イベントについて、該当のイベントの詳細や記録されたイベントレコード(JSON形式)の生データを確認できます。
詳細ではイベント時間、実行したユーザー名、実行されたイベント名、イベントソース(どのサービスのAPIなのか?)、AWSアクセスキー、リクエストの発信元IPアドレスなどよく使われる情報がざっと確認できます。
イベントレコードは後述するイベントの内容がJSON形式でそのまま閲覧できます
CloudTrailイベントとは?
CloudTrailが記録するイベントは以下の3種類です。
- 管理イベント
- データイベント
- インサイトイベント
管理イベント
AWSアカウント内のリソースに対して実行される管理操作で、イベント履歴から確認できるデフォルトで記録が有効化されているイベントです。
記録されるイベントの例は以下。
- IAMロールのアタッチ(IAM AttachRolePolicy)
- VPCの作成(EV2 CreateSubnet)
- CloudTrail証跡の作成(CloudTrail CreateTrail)
リソースの変更操作を行わない読み取りイベント、変更する可能性がある書き込みイベントの2つに分類でき、ログの記録設定ではどちらか一方・または両方を記録するように設定できます。
また、管理イベントにはKMSキーの自動ローテーション、マネジメントコンソールへのサインインなど一部APIアクティビティではないものが記録されます
データイベント
リソース上またはリソース内で実行されたAPIオペレーションです。
記録されるイベントの例は以下。
- S3バケット内のオブジェクトに対するAPI操作(S3 GetObject、DeleteObject、PutObject)
- Lambda関数の実行(Lambda Invoke)
データイベントを取得するためには証跡やイベントデータストアなどを利用した明示的なイベント記録の有効化が必要になります。
イベントの性質上大量に実行されるケースが多いため、記録されるイベントの数も膨大になりやすいです。そのため、ログへの記録設定と合わせて記録するイベントタイプを選択するイベントセレクタの設定の利用が推奨されます。イベントセレクタではイベントのresources.type 値単位でログ記録するイベントを選択できます。
データイベントにも読み取りイベント・書き込みイベントの概念があるため、監査要件にもよりますがログ量の抑制策の1つとして「書き込みのデータイベントだけを記録する」など取得するログを絞る案が有効です。
インサイトイベント
CloudTrail管理イベントを継続的に分析した結果検知したAPIの異常アクティビティを記録します。管理イベントを記録している証跡やイベントデータストアと合わせて有効化します。
インサイトイベントはCloudTrail Insightsという、CloudTrailのオプション機能を有効化することで記録されるようになります。
CloudTrail Insightsは、管理イベントを継続的に監視・分析しAPI呼び出しやAPIエラー率に関する異常値を検知した際に異常アクティビティとして検知しインサイトイベントを出力します。
直近のアップデートでCloudTrail Lakeでもインサイトイベントが取得できるようになっています。
(参考)CloudTrailで記録できないイベント
CloudTrailは多くのイベントを記録しますが、サポートされていないサービスもあります。
- プレビュー段階のサービス
- 一般公開(GA)されていないサービス
- 公開APIがないサービス
どのサービスがサポートされているのか確認したい場合は、AWS公式ドキュメントをご確認ください。
CloudTrailのログについて
CloudTrailイベントを記録するログには、誰が/いつ/どこから/どんなリクエストを送信して/どのようなレスポンスがあったのか、という情報が含まれています。
AWS公式ドキュメントにあるサンプルをベースにファイルを確認してみましょう。
{"Records": [{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "EXAMPLE6E4XEGITWATV6R", "arn": "arn:aws:iam::123456789012:user/Mateo", "accountId": "123456789012", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "Mateo", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "creationDate": "2023-07-19T21:11:57Z", "mfaAuthenticated": "false" } } }, "eventTime": "2023-07-19T21:17:28Z", "eventSource": "ec2.amazonaws.com", "eventName": "StartInstances", "awsRegion": "us-east-1", "sourceIPAddress": "192.0.2.0", "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.start-instances", "requestParameters": { "instancesSet": { "items": [ { "instanceId": "i-EXAMPLE56126103cb" }, { "instanceId": "i-EXAMPLEaff4840c22" } ] } }, "responseElements": { "requestId": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16", "instancesSet": { "items": [ { "instanceId": "i-EXAMPLEaff4840c22", "currentState": { "code": 0, "name": "pending" }, "previousState": { "code": 80, "name": "stopped" } }, { "instanceId": "i-EXAMPLE56126103cb", "currentState": { "code": 0, "name": "pending" }, "previousState": { "code": 80, "name": "stopped" } } ] } }, "requestID": "e4336db0-149f-4a6b-844d-EXAMPLEb9d16", "eventID": "e755e09c-42f9-4c5c-9064-EXAMPLE228c7", "readOnly": false, "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "123456789012", "eventCategory": "Management", "tlsDetails": { "tlsVersion": "TLSv1.2", "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256", "clientProvidedHostHeader": "ec2.us-east-1.amazonaws.com" }, "sessionCredentialFromConsole": "true" }]}
はじめのUserIdentityの項目は、CloudTrailログの「誰が(Who)」にあたる情報が記されています。
"userIdentity": { "type": "IAMUser", "principalId": "EXAMPLE6E4XEGITWATV6R", "arn": "arn:aws:iam::123456789012:user/Mateo", "accountId": "123456789012", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "Mateo", "sessionContext": { "sessionIssuer": {}, "webIdFederationData": {}, "attributes": { "creationDate": "2023-07-19T21:11:57Z", "mfaAuthenticated": "false" } }
ここではログに記録されているAPIアクティビティに関する、以下の情報がわかります。
- AWSアカウント(123456789012) の (
userIdentity.accountId
) - IAMユーザー Mateo のIAM認証情報 である (
userIdentity.arn
) - 認証情報はMFA認証なしで 2023年7月19日 21:11:57 UTCに発行された (
userIdentity.sessionContext.attributes
)
どのIAM認証情報からそのAPIが実行されたか?という情報は大変重要なのでよく確認する項目です。
続いては、以下のいつ・どこから に関する情報です。
"eventTime": "2023-07-19T21:17:28Z", "eventSource": "ec2.amazonaws.com", "eventName": "StartInstances", "awsRegion": "us-east-1", "sourceIPAddress": "192.0.2.0", "userAgent": "aws-cli/2.13.5 Python/3.11.4 Linux/4.14.255-314-253.539.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off command/ec2.start-instances",
ここからは、以下の情報がわかります。
- そのAPIアクティビティは 2023年7月19日 21:17:28 UTCにリクエストが完了し (
eventTime
) - 実行されたAPIは、ec2.amazonaws.comに対するStartInstances である (
eventSource
,eventName
) - 実行されたリージョンはバージニア北部(us-east-1)である (
awsRegion
) - リクエストの実行元のソースIPアドレスは「192.0.2.0」で (
sourceIPAddress
) - CloudShellから実行された (
userAgent
)
ここまで紹介したように、CloudTrailログからはAPIリクエストに関する様々な情報が得られます。
ログの記録方法
デフォルトのCloudTrail設定では、イベント履歴上では90日以前のログは確認できません。
また、S3などユーザーが直接データに触れられるようなストレージへの保存もされておらず、管理イベントと呼ばれるAWSリソースに関する操作履歴以外のログ記録はされていません。
管理イベントの長期間(90日以上)保存の要件を満たすため、外部ストレージへのエクスポート、管理イベント以外のイベントを取得するために、ログの記録・取得設定を別途実施する必要があります。
ログ記録を行う手段は、現状2つあります。
- 証跡
- イベントデータストア
証跡
証跡はCloudTrailが記録したAPIアクティビティをキャプチャし、保存する仕組みです。
証跡に記録するCloudTrailログの種類は任意で選択可能で、1つの証跡で複数イベントの記録もできます。
- 管理イベント
- データイベント
- Insightsイベント
ログは証跡で指定したS3バケットに配信されます。配信先は証跡とAWS同じアカウント内でも良いですし、別のAWSアカウントにあるS3バケットも指定できます。
証跡ログの記録範囲はマルチリージョン(利用中のすべてのリージョン)もしくは単一リージョン(指定した1つのリージョン)のどちらかを指定します。
AWSマネジメントコンソールから証跡を作成するとマルチリージョン証跡となり、単一リージョン証跡を作るためにはAWS CLIなど他のAPIツールから証跡を作成する必要があります。
AWS Organizations環境では、組織の証跡が利用できます。組織の証跡を利用すると、Organizations組織内のメンバーアカウントすべてに管理アカウントの証跡のコピーが自動で作成されます。
組織証跡では、特定のAWSアカウント・AWSリージョンのみを指定して証跡をコピーする機能は現状ないため、組織の全アカウントに一括で証跡を作成することになります。
AWS Control TowerというセキュアなAWSマルチアカウント環境をデプロイ・管理できるサービスでは、バージョン3.0からCloudTrailの組織証跡を管理するオプションが追加されました。
イベントデータストア
イベントデータストアとはCloudTrail Lake利用の前提となる、CloudTrailイベントを収集する独自ストレージです。S3ではありません。
イベントデータストアは作成時、収集するイベントのタイプを以下の中から選択します。
- CloudTrailイベント(管理、データ、インサイト)
- Config設定項目
- AWS外部のイベント
イベントデータストアはイミュータブルであり、ユーザーによる能動的なデータの削除ができません。 保存したデータはサービス側で指定した保存期間を過ぎたのちに自動で削除されます。
データの保存期間はイベントデータストア作成時に指定できますが、別のパラメータとして指定する購入(Pricing)オプションによって選択できる幅が変わります。
購入オプション | デフォルトの保持期間 | 最小保持期間 | 最大保持期間 |
---|---|---|---|
1 年間の延長可能な保持価格 | 366日(約1年) | 7日 | 3653日(約10年) |
7 年間の保持価格 | 2557日(約7年) | 7日 | 2557日(約7年) |
イベントデータストアも証跡と同様、AWS Organizationsの利用前提となりますが組織単位の有効化オプションがあります。
ただし、イベントデータストアの組織単位の有効化も証跡と同様にAWSアカウント・リージョンを指定した有効化はできないため、すべての管理対象への一括設定しかできません。
その他ログ記録方法
Amazon Security Lakeというサービスを利用すると、CloudTrailイベントをはじめ様々なAWSログをS3バケットに集約し、保存データを正規化し、ログへのクロスアカウントアクセス機能がマネージドに提供されます。
CloudTrailログ以外のAWSログも特定のS3バケットに集約したい要件がある場合は検討ください。
Security Lakeは前述した2つの機能と異なり、AWSアカウント・リージョンごとにログの収集対象を指定できます。Security Lakeはより柔軟にログを取得できると覚えておくといいかもしれないです。
ログのセキュリティ
CloudTrailログを監査証跡とするために、CloudTrailログ自体の信頼性を高めることが大切です。
CloudTrailでは、保存されるログが改ざん(削除や変更)されていないことを継続的に確かめるために、整合性の検証機能が提供されています。
整合性検証は、ログファイルとはまた別のフォルダに配信するログのハッシュが含まれたダイジェストファイルを作成します。
ダイジェストファイルによって、ログファイルが配信後に変更されていないことを確認できます。
ログのセキュリティを向上させるにあたって、CloudTrailの機能だけでなく、証跡によるログ保存先のS3バケットのセキュリティ機能を利用することも効果的です。
オブジェクトロックを利用すると、rootユーザーのような強力な権限を持っていてもログが改ざんできないように証跡やログを保護できます(=コンプライアンスモード)
イベントの確認方法
CloudTrailのログを確認手段は複数あります。それぞれ確認するログの保存場所、確認方法が異なります。
主に以下3種類で、「確認方法:ログの配信方法とログ保存先」の形式で以下にまとめました。
- イベント履歴:
デフォルト有効のCloudTrail管理イベント
- Amazon Athenaの利用:
証跡によってS3バケットに保存されたCloudTrailイベント
- CloudTrail Lake クエリエディタの利用:
CloudTrail Lakeイベントデータストアで集約されたCloudTrailイベント
イベント履歴
イベント履歴については、冒頭の「始め方」で紹介したため概要については省きます。
90日間以内に起きたAWSに関するトラブルシューティングの用途や、イベントをサクッと検索するときにはイベント履歴をよく使います。
Amazon Athenaの利用
Amazon AthenaはSQLを利用してS3バケット内のデータを分析できるインタラクティブなクエリサービスです。
90日以前のイベントを検索したい時や、SQLクエリを利用した高度なログ検索を行うときにAthenaを使います。
クエリの実行に料金がかかりますが、証跡を利用して保存したS3バケット内のCloudTrailイベントを分析できます。
イベント履歴からAthenaテーブルを作成
を選択すると、S3に保存したデータのテーブルクエリが自動で生成されてそのままAthenaテーブルが簡単に作成できます。
Athenaのコンソールに移動するとテーブルが作成されているため、任意のクエリを実行することで、S3に保存されたログの分析が可能です。
CloudTrail Lake クエリエディタの利用
CloudTrail Lakeのクエリエディタを利用すると、イベントデータストアに保存されたCloudTrailログに対してクエリを実行できます。
クエリエディタでは200種類以上ある目的別のサンプルクエリが利用でき、サンプルを選択するとクエリが自動で生成されるため大変便利です。
ダッシュボードからクエリを実行
を選択すると、指定した期間内のイベントデータストアのログを対象にクエリが実行され、簡易的なダッシュボードが自動で生成されます。
ユースケースはAthenaを使う時とほぼ同じですがこちらはイベントデータストア(CloudTrail Lake)の利用が前提となるため、利用していない方は使えません。CloudTrail Lakeを使っている方はガンガン使っていきましょう、これから使いたい方はイベントデータストアを有効化しましょう!個人的にサンプルクエリとダッシュボード機能がとても好きです。
利用料金
CloudTrailイベントの種類によって配信料金が異なり、以下のようになっています。
イベントの種類 | 料金 |
---|---|
S3に配信された管理イベント | 2.00USD / 100,000イベントあたり |
S3に配信されたデータイベント | 0.10USD / 100,000イベントあたり |
CLoudTrail Insightsイベント | 0.35USD / イベントタイプごとに分析された100,000イベントあたり |
CloudTrail Lakeは通常のCloudTrailイベントとは別の料金形態が設定されています。取り込み料金に保持料金が同梱されているところが特徴です。
種類 / 購入オプション | 1年間の延長可能な保持料金 | 7年間の保持料金 |
---|---|---|
データ取り込み | 0.75 USD/GB (管理イベント/データイベント)、0.50 USD/GB(その他のAWSログ・AWS以外のログ) | 〜5TB/月: 2.5USD/GB、〜20TB/月: 1USD/GB、25TB/月〜: 0.50USD/GB |
データ保持 | 最初の1年は無料(取り込みコストに同梱)、2年目から 0.023USD/GB(1ヶ月あたり) | 7年間無料(取り込みコストに同梱) |
また、以下の無料枠があります。
- デフォルトのCloudTrail管理イベントの記録 と イベント履歴の利用
- 新規にCloudTrail Lakeを利用し始めた最初の30日間
- CoudTrail管理イベントを保存する証跡、リージョンごとに1つ
証跡はリージョンごとに1つまで無料なので、使わないと勿体無いです。ぜひすべてのAWSアカウントに証跡を設定しログを長期保存しましょう。
さいごに
CloudTrail、AWSを運用していく上で必須のサービスです。ぜひ押さえておきましょう。
以上、「AWS 入門ブログリレー 2024」の 40 日目のエントリ「AWS CloudTrail」編でした。このブログがどなたかのご参考になれば幸いです。
次回、2024/5/11 は弊社 niino による「Amazon Personalize」でした!